﻿#ifndef __PHASEIDENTIFY_H__
#define __PHASEIDENTIFY_H__
#include <vector>
#include "SerialPort.h"

class MainWindow;

class PhaseIdentify {
public:
	/*
	D7	D6	D5	D2	D1	D0	相序类型	物理相位
	0	0	0	0	0	1	正常	A相
	0	0	0	0	1	0	正常	B相
	0	0	0	1	0	0	正常	C相
	1	1	0	0	0	1	零火反接	A相
	1	1	0	0	1	0	零火反接	B相
	1	1	0	1	0	0	零火反接	C相
	0	0	0	1	1	1	正常	A / B / C相
	1	1	0	1	1	1	零火反接	A / B / C相
	0	0	1	1	1	1	逆相序	A / C / B相
	0	1	0	1	1	1	逆相序	B / A / C相
	0	1	1	1	1	1	逆相序	B / C / A相
	1	0	0	1	1	1	逆相序	C / A / B相
	1	0	1	1	1	1	逆相序	C / B / A相
	x	x	x	x	x	x	未知	未知
	*/
	static const uint8_t phaseTypeMask = 0b11100111;  // 掩码
	static const uint8_t phaseTypeNormalA = 0b00000001;  // 正常	A相
	static const uint8_t phaseTypeNormalB = 0b00000010;  // 正常	B相
	static const uint8_t phaseTypeNormalC = 0b00000100;  // 正常	C相
	static const uint8_t phaseTypeReverseA = 0b11000001;  // 零火反接	A相
	static const uint8_t phaseTypeReverseB = 0b11000010;  // 零火反接	B相
	static const uint8_t phaseTypeReverseC = 0b11000100;  // 零火反接	C相
	static const uint8_t phaseTypeNormalABC = 0b00000111;  // 正常	A/B/C相
	static const uint8_t phaseTypeReverseABC = 0b11000111;  // 零火反接	A/B/C相
	static const uint8_t phaseTypeInverseACB = 0b00100111;  // 逆相序	A/C/B相
	static const uint8_t phaseTypeInverseBAC = 0b01000111;  // 逆相序	B/A/C相
	static const uint8_t phaseTypeInverseBCA = 0b01100111;  // 逆相序	B/C/A相
	static const uint8_t phaseTypeInverseCAB = 0b10000111;  // 逆相序	C/A/B相
	static const uint8_t phaseTypeInverseCBA = 0b10100111;  // 逆相序	C/B/A相
	static const uint8_t phaseTypeLackBC = 0b11100001;  // 缺B/C相	A相/未知/未知
	static const uint8_t phaseTypeLackAC = 0b11100010;  // 缺A/C相	B相/未知/未知
	static const uint8_t phaseTypeLackAB = 0b11100100;  // 缺A/B相	C相/未知/未知

	PhaseIdentify(MainWindow& mw, std::shared_ptr<SerialPort> sp);

	void sendQueryNodeNumber();
	void sendBatchQueryNodePhaseInfo();

	void handleQueryNodeNumberResult(const QByteArray relayMessage);
	void handleBatchQueryNodePhaseInfoResult(const QByteArray& relayMessage);
	void decodePhaseInfo(uint8_t phaseInfo, QString& phaseSequenceType, QString& physicalPhase);
	void eraseOldCnt(uint8_t phaseInfo);
private:
	MainWindow& mainWindow;

	std::shared_ptr<SerialPort> serialPort;

	// 查询从结点个数
	std::vector<int> queryNodeNumber;
	// 从节点总数量
	uint64_t nodeTotalCnt = 0;
	// 查询到相位信息的从节点数量
	uint64_t hasSearchedPhaseInfoNodeCnt = 0;

	// 批量查询从节点相位信息
	std::vector<int> batchQueryNodePhaseInfo;
	std::map<QString, uint8_t> allNodePhaseInfo;
	// APhaseCnt BPhaseCnt CPhaseCnt ABCPhaseCnt otherCnt
	std::vector<uint32_t> phaseCnt = { 0, 0, 0, 0, 0 };
};


#endif